/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.classe;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author Matheus Cardoso
 */
public class DEC_CLASSE_INTERNA extends Producao{
    @Override
    public void setSimbolo() {
        this.simbolo = new NaoTerminal(this.getClass().getSimpleName());
    }
    
    @Override
    public SimboloGramatical derivar() throws Exception {
        //throw new UnsupportedOperationException("Not supported yet.");
        
        TokenReader tokenReader = TokenReader.getInstance();
        
        Token token = null;
        
        NaoTerminal naoTerminal = (NaoTerminal) this.simbolo;
        
        token = tokenReader.seeCurrent();
        if(token.getTokenClass().equals(TokenClass.PALAVRA_RESERVADA) && token.getAtributo().toString().equals("class")){
            tokenReader.consome();
            naoTerminal.add(new Terminal(token));
            
        } else {
            erro(this.getClass().getSimpleName() + " mal formada - 'class' não encontrado");
            return simbolo;
        }
        
        naoTerminal.add(new NOME().derivar());
        
        token = tokenReader.seeCurrent();
        if(token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals("{")){
            tokenReader.consome();
            naoTerminal.add(new Terminal(token));
            
        }else{
            erro(this.getClass().getSimpleName() + " mal formada - '{' não encontrado");
            return simbolo;
        }
        
        token = tokenReader.seeCurrent();
        while(!(token.getTokenClass().equals(TokenClass.DELIMITADOR) || token.getAtributo().equals("}")) && tokenReader.hasToken()){
            naoTerminal.add(new DEC_ATRIBUTO().derivar());
            token = tokenReader.seeCurrent();
            
        }

        //token = tokenReader.seeNext();
        if(token.getTokenClass().equals(TokenClass.DELIMITADOR) && token.getAtributo().equals("}")){
            tokenReader.consome();
            naoTerminal.add(new Terminal(token));
        }
        
        return this.simbolo;
    }
}
